using Microsoft.Extensions.Caching.Memory;

namespace ImoviesBlazor.Server.Helpers
{
    public class CacheUtils
    {
        // 缓存的配置
        // MemoryCache myCache = new MemoryCache(new MemoryCacheOptions()
        // {
        //     // 缓存最大为100份
        //     // 注意netcore中的缓存是没有单位的，缓存项和缓存的相对关系
        //     SizeLimit = 100,
        //     // 缓存满了时，压缩20%（即删除20份优先级低的缓存项）
        //     CompactionPercentage = 0.2,
        //     // 三秒钟查找一次过期项
        //     ExpirationScanFrequency = TimeSpan.FromSeconds(3)
        // });

        private static IMemoryCache _myCache = null;
        static CacheUtils()
        {
            if (_myCache == null)
            {
                _myCache = new MemoryCache(new MemoryCacheOptions());
            }
        }

        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <typeparam name="T">设置值的类型</typeparam>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        public static void SetData<T>(string key, T value)
        {
            // 滑动过期时间，3分钟后
            // 即三秒钟内被访问，则重新刷新缓存时间为3分钟后
            _myCache.Set<T>(key, value, new MemoryCacheEntryOptions
            {
                SlidingExpiration = TimeSpan.FromMinutes(3),
            });
        }

        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <typeparam name="T">设置值的类型</typeparam>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="expTime">缓存过期时间（滑动过期时间），单位分钟m</param>
        public static void SetData<T>(string key, T value, int expTime)
        {
            // 滑动过期时间
            _myCache.Set<T>(key, value, new MemoryCacheEntryOptions
            {
                SlidingExpiration = TimeSpan.FromMinutes(expTime),
            });
        }


        /// <summary>
        /// 获取缓存值
        /// </summary>
        /// <typeparam name="T">获取值的类型</typeparam>
        /// <param name="key">键</param>
        /// <returns>T?</returns>
        public static T? GetData<T>(string key)
        {
            return _myCache.Get<T>(key);
        }
    }
}